#!/usr/bin/env python
# -*- coding:utf-8 -*-
from django.conf import settings
from django.core.files.storage import Storage
from django.core.exceptions import ImproperlyConfigured
from django.utils.deconstruct import deconstructible
from fdfs_client.client import Fdfs_client


@deconstructible
class FasfDFSStorage(Storage):
    def __init__(self, base_url=None, client_conf=None):
        """
       初始化
       :param base_url: 用于构造图片完整路径使用，图片服务器的域名
       :param client_conf: FastDFS客户端配置文件的路径
       """
        if hasattr(settings, 'FDFS_URL'):
            self.base_url = settings.FDFS_URL
        else:
            raise ImproperlyConfigured("请配置FDFS_URL为Traker的地址")
        if hasattr(settings, 'FDFS_CLIENT_CONF'):
            self.client_conf = settings.FDFS_CLIENT_CONF
        else:
            raise ImproperlyConfigured("请配置FDFS_CLIENT_CONF为config文件路径的地址")

        self.client = Fdfs_client(self.client_conf)

    def _open(self, name, mode='rb'):
        """
        用不到打开文件(交给docker镜像中的nginx处理了)，所以省略
        """
        pass

    def _save(self, name, content):
        """
        在FastDFS中保存文件
        :param name: 传入的文件名
        :param content: 文件内容
        :return: 保存到数据库中的FastDFS的文件名
        """
        print(name)
        ret = self.client.upload_by_buffer(content.read(), file_ext_name=name.split('.')[-1])
        if ret.get('Status') != "Upload successed.":
            raise Exception('上传图片失败')

        file_name = ret.get('Remote file_id')
        print(file_name)
        return file_name

    def url(self, name):
        """
        返回文件的完整URL路径
        在使用ImageField的 url属性的时候，这个方法会被调用
        :param name: 数据库中保存的文件名
        :return: 完整的URL
        """
        return self.base_url + name

    def exists(self, name):
        """
        判断文件是否存在，FastDFS可以自行解决文件的重名问题
        所以此处返回False，告诉Django上传的都是新文件
        :param name:  文件名
        :return: False
        """
        return False
